/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V2.0
  * @date    2024-09-10
  * @brief   使用举例-串口管理
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "bsp.h"

#include "uart_handler.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
static uint8_t txBuf[128]; /* 串口管理所需发送缓冲区 */
static uint8_t rxBuf[128]; /* 串口管理所需接收缓冲区 */
static uart_handler_t usart1Hr; /* 串口管理实例 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/**
  * @brief  This function handles SysTick Handler.
  *
  * @param  None
  *
  * @retval None
  */
void SysTick_Handler(void)
{
    /* 组件计时节拍接口 */
    mw_tick_inc(1);
}

/**
  * @brief  串口中断函数
  *
  * @param  None
  *
  * @retval None
  */
void USART1_IRQHandler(void)
{
    static uint8_t rxData, txData, ret;
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        rxData = USART_ReceiveData(USART1);
        /* 写入接收缓存 */
        ret = uart_hr_write_rx_buf(&usart1Hr, &rxData, 1);
        if(0 == ret)
        {
            MW_WARN_LOG("uart_hr_write_rx_buf failure");
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
    
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {
        /* 读出发送缓存 */
        ret = uart_hr_read_tx_buf(&usart1Hr, &txData, 1);
        if(1 == ret)
        {
            USART_SendData(USART1, txData);
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_TXE);
    }
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    MW_VER_LOG("example-uart_handler", 2, 0, 0);
    
    /* BSP初始化 */
    bsp_init();
    
    /* 串口管理初始化 帧间隔500ms 接收超时时间2000ms */
    uart_hr_init(&usart1Hr, txBuf, sizeof(txBuf), rxBuf, sizeof(rxBuf), bsp_usart1_tx_en, 500, 2000);

    while(1)
    {
        static uint8_t ret;
        static uint8_t rxBufTmp[100];
        /* 串口管理轮询处理 */
        ret = uart_hr_poll(&usart1Hr);
        /* 接收完成 */
        if(MW_RET_OK == ret)
        {
            /* 串口管理读取数据 */
            uint16_t dataLen = uart_hr_read_rx_buf(&usart1Hr, rxBufTmp, sizeof(rxBufTmp));
            /* 串口管理发送数据 */
            uart_hr_write_tx_buf(&usart1Hr, rxBufTmp, dataLen);
            MW_DEBUG_LOG("uart rec complate");
        } /* 接收超时 无需求可忽略此返回值 */
        else if(MW_RET_TIMEOUT == ret)
        {
            MW_WARN_LOG("uart rec timeout");
        }
    }
}

